import { defineStore } from 'pinia'
import request from '@/utils/request'
import { Profile } from '@/types/user'
import { ApiRes } from '@/types/data'
import { setUserInfo, getUserInfo, removeUserInfo } from '@/utils/storage'
import useStore from '..'
// https://www.npmjs.com/package/pinia-plugin-persistedstate
// 课后使用这个插件实现本地存储的一键配置 
// vuex-persistedstate
const useHomeStore = defineStore('user', {
  state() {
    return {
      userInfo: getUserInfo() as Profile
    }
  },
  actions: {
    // 账号+密码登录的请求
    async login(data: { account: string, password: string }) {
      const res = await request.post<ApiRes<Profile>>('/login', data)
      this.userInfo = res.data.result
      // 存储到本地
      setUserInfo(res.data.result)
      // 登录成功后合并购物车
      const { cart } = useStore()
      cart.mergeCart()
    },
    //     目前的手机+验证码登录  两种情况
    // 1. 只要使用手机号和验证码登录  既注册 也登录
    // 2. 没有在当前网站中注册过, 拿着陌生的手机号来手机号和验证码登录 不认识你
    // 获取手机短信验证码
    async getCode(mobile: string) {
      await request.get('/login/code', { params: { mobile } })
    },
    // 手机号+验证码登录的请求
    async loginCode(data: { mobile: string, code: string }) {
      const res = await request.post<ApiRes<Profile>>('/login/code', data)
      this.userInfo = res.data.result
      // 存储到本地
      setUserInfo(res.data.result)
      // 登录成功后合并购物车
      const { cart } = useStore()
      cart.mergeCart()
    },
    // 退出
    logout() {
      const { cart } = useStore()
      // 清除本地和pinia中的userInfo的数据即可
      removeUserInfo()  //--直接清除
      // setUserInfo({} as Profile) // 设置为空
      this.userInfo = {} as Profile
      // 清空购物车
      cart.clearCart()
    },
    //--------------------------------
    // 三方登录(情况1直接去首页)
    async qqLogin(unionId: string, source: number = 6) {
      const res = await request.post<ApiRes<Profile>>('/login/social', { unionId, source })
      // 将个人信息存储到本地和pinia中
      this.userInfo = res.data.result
      // 存储到本地
      setUserInfo(res.data.result)
      // 登录成功后合并购物车
      const { cart } = useStore()
      cart.mergeCart()
    },
    // 三方登录账号绑定(情况2 qq和手机绑定)
    async bindQQLogin(unionId: string, mobile: string, code: string) {
      const res = await request.post<ApiRes<Profile>>('/login/social/bind',
        { unionId, mobile, code })
      // console.log(res)
      // 将个人信息存储到本地和pinia中
      this.userInfo = res.data.result
      // 存储到本地
      setUserInfo(res.data.result)
      // 登录成功后合并购物车
      const { cart } = useStore()
      cart.mergeCart()
    },
    // QQ绑定手机号发送验证码
    async sendQQbindMsg(mobile: string) {
      await request.get('/login/social/code', { params: { mobile } })
    },
    // 三方登录 无账号 无QQ绑定 发送验证码
    async sendQQPathMsg(mobile: string) {
      await request.get('/register/code', {
        params: {
          mobile
        }
      })
    },
    // 绑定完善信息 情况3
    async qqPatchLogin(data: any) {
      const res = await request.post<ApiRes<Profile>>(
        `/login/social/${data.openId}/complement`,
        data
      )
      // 1. 保存用户信息到 state 中
      this.userInfo = res.data.result
      setUserInfo(res.data.result)
      // 登录成功后合并购物车
      const { cart } = useStore()
      cart.mergeCart()
    }
  },
  getters: {}
})

export default useHomeStore
